๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ์ ๋ํ ์ฌ์ธต ๋ถ์: ์๋ฐ์คํฌ๋ฆฝํธ ๊ฒฉ๋ฆฌ, ํต์ ์ ๋ต, ๋ณด์ ๊ณ ๋ ค์ฌํญ ๋ฐ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ: ์๋ฐ์คํฌ๋ฆฝํธ ๊ฒฉ๋ฆฌ ๋ ํต์
๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ์น ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ฅ์ ํฅ์์์ผ ์ฌ์ฉ์์๊ฒ ๋ง์ถคํ ๊ฒฝํ๊ณผ ๊ฐ์ํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ง์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ํต์ฌ์๋ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค. ์ด๋ ์น ํ์ด์ง์ ์ฃผ์ ๋์ด DOM(๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ)๊ณผ ์ํธ ์์ฉํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋๋ค. ์ด๋ฌํ ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง, ํนํ ํธ์คํธ ํ์ด์ง๋ก๋ถํฐ์ ๊ฒฉ๋ฆฌ ๋ฐ ํต์ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ๊ฒฌ๊ณ ํ๊ณ ์์ ํ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ๋ฌด์์ธ๊ฐ?
์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ํน์ ์น ํ์ด์ง์ ์ปจํ ์คํธ์์ ์คํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋๋ค. ํ์ด์ง์ DOM์ ์ ๊ทผํ ์ ์์ด ๋ด์ฉ์ ์์ ํ๊ณ , ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๋ฉฐ, ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์๋ตํ ์ ์์ต๋๋ค. ์ผ๋ฐ ์น ํ์ด์ง ์คํฌ๋ฆฝํธ์ ๋ฌ๋ฆฌ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ์ด๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ ํ๋ ์์ํฌ์ ์ํด ๋ก๋๋๊ณ ์คํ๋ฉ๋๋ค.
์ค์ฉ์ ์ธ ์๋ก, ์น ํ์ด์ง์์ ํน์ ํค์๋๋ฅผ ์๋์ผ๋ก ๊ฐ์กฐ ํ์ํ๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ DOM ๋ด์์ ์ด๋ฌํ ํค์๋๋ฅผ ์๋ณํ๊ณ ์คํ์ผ์ ์ ์ฉํ์ฌ ๊ฐ์กฐํฉ๋๋ค. ๋ ๋ค๋ฅธ ์๋ก๋ ์ฌ์ฉ์๊ฐ ์ ํํ ์ธ์ด์ ๋ฐ๋ผ ํ์ด์ง์ ํ ์คํธ๋ฅผ ๋ฒ์ญ๋ ๋ฒ์ ์ผ๋ก ๋์ฒดํ๋ ๋ฒ์ญ ํ์ฅ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ์ด๋ ๊ฐ๋จํ ์์ผ ๋ฟ์ด๋ฉฐ, ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ๋ฌดํํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฒฉ๋ฆฌ: ์๋๋ฐ์ค
์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ์ข ์ข "์๋ฐ์คํฌ๋ฆฝํธ ์๋๋ฐ์ค"๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ค์ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์๋ํฉ๋๋ค. ์ด๋ฌํ ๊ฒฉ๋ฆฌ๋ ๋ณด์๊ณผ ์์ ์ฑ์ ์ํด ํ์์ ์ ๋๋ค. ๊ฒฉ๋ฆฌ๊ฐ ์๋ค๋ฉด, ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ์ ์ฌ์ ์ผ๋ก ํธ์คํธ ํ์ด์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฉํดํ๊ฑฐ๋ ํ์ด์ง์ ์ฃผ์ ๋ ์ ์ฑ ์ฝ๋์ ์ํด ์์๋ ์ ์์ต๋๋ค.
๊ฒฉ๋ฆฌ์ ์ฃผ์ ํน์ง:
- ๋ณ์ ๋ฒ์: ์ฝํ ์ธ ์คํฌ๋ฆฝํธ์ ์น ํ์ด์ง ์คํฌ๋ฆฝํธ๋ ๋ณ๋์ ์ ์ญ ๋ฒ์๋ฅผ ๊ฐ์ง๋๋ค. ์ฆ, ์ฝํ ์ธ ์คํฌ๋ฆฝํธ์ ์ ์๋ ๋ณ์์ ํจ์๋ ์น ํ์ด์ง ์คํฌ๋ฆฝํธ์์ ์ง์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ด๋ ์ด๋ฆ ์ถฉ๋๊ณผ ์๋ํ์ง ์์ ์์ ์ ๋ฐฉ์งํฉ๋๋ค.
- ํ๋กํ ํ์ ์ค์ผ ์ํ: ์ต์ ๋ธ๋ผ์ฐ์ ๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋ด์ฅ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด(์: `Object.prototype`, `Array.prototype`)์ ํ๋กํ ํ์ ์ ์์ ํ์ฌ ์ทจ์ฝ์ ์ ์ฃผ์ ํ๋ ค๋ ํ๋กํ ํ์ ์ค์ผ ๊ณต๊ฒฉ์ ์ํํ๋ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ฌ์ ํ ๊ฒฝ๊ณํด์ผ ํ์ง๋ง, ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ์ด๋ฌํ ๋ณดํธ ๊ธฐ๋ฅ์ ์ด์ ์ ๋๋ฆฝ๋๋ค.
- Shadow DOM (์ ํ ์ฌํญ): Shadow DOM์ DOM ํธ๋ฆฌ์ ์ผ๋ถ๋ฅผ ์บก์ํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ, ์๋์ฐ ๋ฃจํธ ์ธ๋ถ์ ์คํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๊ฐ ๋ด๋ถ ์์์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ํ์ฅ ํ๋ก๊ทธ๋จ์ Shadow DOM์ ํ์ฉํ์ฌ UI ์์๋ฅผ ํธ์คํธ ํ์ด์ง๋ก๋ถํฐ ๋์ฑ ๊ฒฉ๋ฆฌํ ์ ์์ต๋๋ค.
์์: `myVariable`์ด๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ ์ํ๋ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๋ง์ฝ ์น ํ์ด์ง๋ ๋์ผํ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ ์ํ๋๋ผ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ฐ ๋ณ์๋ ๊ฐ๊ฐ์ ๋ฒ์์ ์กด์ฌํฉ๋๋ค.
ํต์ : ๊ฒฉ์ฐจ ํด์ํ๊ธฐ
๊ฒฉ๋ฆฌ๋ ์ค์ํ์ง๋ง, ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ์ข ์ข ๋ฐ์ดํฐ ์ ์ฅ, ์ธ๋ถ API ์ ๊ทผ, ๋๋ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ๊ณผ์ ์ํธ ์์ฉ๊ณผ ๊ฐ์ ์์ ์ ์ํํ๊ธฐ ์ํด ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ์ ํต์ ํด์ผ ํฉ๋๋ค. ์ฝํ ์ธ ์คํฌ๋ฆฝํธ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ ๊ฐ์ ํต์ ์ ์ค์ ํ๋ ๋ช ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค.
๋ฉ์์ง ์ ๋ฌ: ์ฃผ์ ํต์ ์ฑ๋
๋ฉ์์ง ์ ๋ฌ์ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ์ดํฐ์ ๋ช ๋ น์ ๊ตํํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด `chrome.runtime.sendMessage`์ `chrome.runtime.onMessage` API(๋๋ ๋ธ๋ผ์ฐ์ ๋ณ ๋๋ฑํ API)๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฉ์์ง ์ ๋ฌ ์๋ ๋ฐฉ์:
- ๋ฉ์์ง ๋ณด๋ด๊ธฐ: ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ `chrome.runtime.sendMessage`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค. ๋ฉ์์ง๋ ๋ฌธ์์ด, ์ซ์, ๋ฐฐ์ด, ๊ฐ์ฒด๋ฅผ ํฌํจํ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๊ฐ ๋ ์ ์์ต๋๋ค.
- ๋ฉ์์ง ๋ฐ๊ธฐ: ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ๋ `chrome.runtime.onMessage`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ฅผ ์์ ๋๊ธฐํฉ๋๋ค. ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
- ๋ฉ์์ง์ ์๋ตํ๊ธฐ: ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ๋ ์ ํ์ ์ผ๋ก ์ฝ๋ฐฑ์ ์ ๊ณต๋ `sendResponse` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ก ์๋ต์ ๋ค์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์์:
์ฝํ ์ธ ์คํฌ๋ฆฝํธ (content.js):
chrome.runtime.sendMessage({action: "getData"}, function(response) {
console.log("Data received: ", response);
// Process the received data
});
๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ (background.js):
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.action == "getData") {
// Fetch data from an API or local storage
let data = {value: "Some data from the background script"};
sendResponse(data);
}
return true; // Indicate that the response will be sent asynchronously
}
);
์ด ์์์ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ก ๋ค์ ๋ณด๋ ๋๋ค. `onMessage` ๋ฆฌ์ค๋์ `return true;`๋ ๋น๋๊ธฐ ์๋ต์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ง์ DOM ์ ๊ทผ (๋ ์ผ๋ฐ์ ์ด๋ฉฐ, ์ฃผ์ ํ์)
๋ฉ์์ง ์ ๋ฌ์ด ์ ํธ๋๋ ๋ฐฉ๋ฒ์ด์ง๋ง, ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ํธ์คํธ ํ์ด์ง์ DOM์ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ถฉ๋ ๋ฐ ๋ณด์ ์ทจ์ฝ์ฑ์ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ง์ DOM ์ ๊ทผ ๊ธฐ์ :
- ์ง์ DOM ์กฐ์: ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ํ์ค ์๋ฐ์คํฌ๋ฆฝํธ DOM ์กฐ์ ๋ฉ์๋(์: `document.getElementById`, `document.createElement`, `element.appendChild`)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง์ ๊ตฌ์กฐ์ ๋ด์ฉ์ ์์ ํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ๋ฆฌ์ค๋: ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ DOM ์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฒจ๋ถํ์ฌ ์ฌ์ฉ์ ์ํธ ์์ฉ์ด๋ ๋ค๋ฅธ ์ด๋ฒคํธ์ ์๋ตํ ์ ์์ต๋๋ค.
- ์คํฌ๋ฆฝํธ ์ฃผ์ : ์ฝํ ์ธ ์คํฌ๋ฆฝํธ๋ ํ์ด์ง์ `